// --- 1. 声明简单枚举 ---
// 定义一个简单的颜色枚举
enum Color {
  red, // index 0
  green, // index 1
  blue, // index 2
  // 可以使用尾随逗号，方便复制粘贴和版本控制
}

// --- 2. 声明增强枚举 ---
// 定义一个增强的交通工具枚举
// 它有字段、方法、常量构造函数，并实现了 Comparable 接口
enum Vehicle implements Comparable<Vehicle> {
  // 枚举实例必须在开头声明，且至少有一个
  // 每个实例都调用常量构造函数
  car(tires: 4, passengers: 5, carbonPerKilometer: 400),
  bus(tires: 6, passengers: 50, carbonPerKilometer: 800),
  bicycle(tires: 2, passengers: 1, carbonPerKilometer: 0);

  // --- 增强枚举的成员 ---

  // 必须是常量构造函数
  const Vehicle({
    required this.tires,
    required this.passengers,
    required this.carbonPerKilometer,
  });

  // 实例变量必须是 final
  final int tires;
  final int passengers;
  final int carbonPerKilometer;

  // 可以有 getter
  // 计算每位乘客的碳足迹（四舍五入）
  int get carbonFootprint => (carbonPerKilometer / passengers).round();

  // 可以有普通方法
  bool get isTwoWheeled => this == Vehicle.bicycle; // 使用 this 引用当前实例

  // 实现 Comparable 接口的方法，用于排序
  // 根据碳足迹排序
  @override
  int compareTo(Vehicle other) => carbonFootprint - other.carbonFootprint;

  // 不能重写 index, hashCode, ==
  // 不能声明名为 values 的成员
  // 不能继承其他类 (除了自动继承 Enum)

  @override
  String toString() {
    // 可以自定义 toString 方法
    return '$name (轮胎: $tires, 乘客: $passengers, 碳足迹/人: $carbonFootprint)';
  }
}

// --- 3. 使用枚举 ---
void main() {
  print('--- 演示使用简单枚举 (Color) ---');

  // 像访问静态变量一样访问枚举值
  final favoriteColor = Color.blue;
  print('我最喜欢的颜色是: $favoriteColor');

  // 在 if 语句中使用
  if (favoriteColor == Color.blue) {
    print('确认过眼神，是最爱的蓝色！💙');
  } else {
    print('嗯？不是蓝色吗？');
  }

  // 访问 index (从 0 开始)
  print('Color.red 的索引: ${Color.red.index}');
  print('Color.green 的索引: ${Color.green.index}');
  print('Color.blue 的索引: ${Color.blue.index}');
  assert(Color.red.index == 0);
  assert(Color.green.index == 1);
  assert(Color.blue.index == 2);
  print('索引断言通过！✅');

  // 获取所有枚举值的列表 (values)
  List<Color> colors = Color.values;
  print('所有颜色值: $colors');
  print('列表中的第三个颜色是: ${colors[2]}');
  assert(colors[2] == Color.blue);
  print('values 列表断言通过！✅');

  // 在 switch 语句中使用
  var aColor = Color.green;
  print('\n对 $aColor 使用 switch:');
  switch (aColor) {
    case Color.red:
      print('像玫瑰一样红！🌹');
      break; // break 是可选的，但通常推荐加上
    case Color.green:
      print('像青草一样绿！🌿');
      break;
    case Color.blue:
      print('像天空一样蓝！🌌');
      break;
    // default 分支不是必须的，但如果没有覆盖所有情况，编译器会警告
    // default:
    //   print('这是一个未知的颜色？ $aColor');
  }

  // 访问枚举值的名称 (.name)
  print('\nColor.blue 的名称是: "${Color.blue.name}"'); // 输出 'blue'
  print('');

  print('--- 演示使用增强枚举 (Vehicle) ---');

  // 访问增强枚举的成员
  var myCar = Vehicle.car;
  print('我的交通工具: $myCar');
  print('汽车的碳足迹/人: ${myCar.carbonFootprint}');
  print('汽车是两轮的吗? ${myCar.isTwoWheeled}');

  var myBike = Vehicle.bicycle;
  print('我的另一个交通工具: $myBike');
  print('自行车的碳足迹/人: ${myBike.carbonFootprint}');
  print('自行车是两轮的吗? ${myBike.isTwoWheeled}');
  print('');

  // 使用 compareTo (基于 Comparable 接口)
  print('比较汽车和自行车的碳足迹:');
  int comparison = myCar.compareTo(myBike);
  if (comparison > 0) {
    print('汽车的碳足迹比自行车高。');
  } else if (comparison < 0) {
    print('汽车的碳足迹比自行车低。');
  } else {
    print('汽车和自行车的碳足迹相同。');
  }

  // 排序车辆列表
  List<Vehicle> vehicles = Vehicle.values.toList(); // 获取所有车辆实例
  print('\n排序前的车辆列表: $vehicles');
  vehicles.sort(); // 使用实现的 compareTo 方法排序
  print('按碳足迹排序后的车辆列表: $vehicles');
  print('');

  print('--- 所有枚举演示完成 ---');
}
